home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1996 March / macformat-035.iso / Shareware City / Developers / ICAppSourceKit1.2 / ICInstall.p < prev    next >
Encoding:
Text File  |  1995-11-07  |  9.0 KB  |  351 lines  |  [TEXT/CWIE]

  1. unit ICInstall;
  2.  
  3. interface
  4.  
  5.     uses
  6.         Types;
  7.         
  8.     procedure AdjustInstalMenu (menu: integer);
  9.     procedure DoInstallMenu (menu, item: integer);
  10.     function InitializeComponentInstallation: OSErr;
  11.  
  12. implementation
  13.  
  14.     uses
  15.         Folders, Components, Resources, Dialogs,
  16.  
  17.         ICTypes, ICCAPI, 
  18.  
  19.         ICMiscSubs, ICGlobals, ICStandardFile, ICDialogs, ICSubs, ICAPI;
  20.  
  21.     const            (* why aren't these in Components.p??? *)
  22.         registerCmpGlobal = 1;
  23.         registerCmpNoDuplicates = 2;
  24.         registerCompAfter = 4;
  25.  
  26.     var
  27.         application_version: longInt;
  28.         installed_version: longInt;
  29.  
  30.     function GetVersionFromResFile: longInt;
  31.         var
  32.             versh: VersRecHndl;
  33.     begin
  34.         GetVersionFromResFile := 0;
  35.         versh := VersRecHndl(Get1Resource('vers', 1));
  36.         if versh <> nil then begin
  37.             GetVersionFromResFile := longInt(versh^^.numericVersion);
  38.         end; (* if *)
  39.     end;
  40.  
  41.     function GetRegisteredVersion: longInt;
  42.         var
  43.             inst: ComponentInstance;
  44.             junk: OSErr;
  45.             refnum: integer;
  46.     begin
  47.         GetRegisteredVersion := 0;
  48.         if has_components then begin
  49.             inst := OpenDefaultComponent(internetConfigurationComponentType, internetConfigurationComponentSubType);
  50.             if inst <> nil then begin
  51.                 refnum := OpenComponentResFile(Component(inst));
  52.                 if refnum <> -1 then begin
  53.                     GetRegisteredVersion := GetVersionFromResFile;
  54.                     CloseResFile(refnum);
  55.                 end;
  56.                 junk := CloseComponent(inst);
  57.             end; (* if *)
  58.         end; (* if *)
  59.     end;
  60.  
  61.     function IsInstalled (var where: FSSpec): boolean;
  62.         var
  63.             err: OSErr;
  64.             ndx: integer;
  65.             found: boolean;
  66.             cpb: CInfoPBRec;
  67.             info: FInfo;
  68.     begin
  69.         err := FindFolder(kOnSystemDisk, kExtensionFolderType, true, where.vRefNum, where.parID);
  70.         where.name := GetAString(128, 12);
  71.         if err = noErr then begin
  72.             err := HGetFInfo(where.vRefNum, where.parID, where.name, info);
  73.             if err <> noErr then begin
  74.                 found := false;
  75.                 ndx := 1;
  76.                 repeat
  77.                     with cpb do begin
  78.                         ioNamePtr := @where.name;
  79.                         ioVRefNum := where.vRefNum;
  80.                         ioDirID := where.parID;
  81.                         ioFDirIndex := ndx;
  82.                     end; (* with *)
  83.                     err := PBGetCatInfoSync(@cpb);
  84.                     if err = noErr then begin
  85.                         found := (cpb.ioFlFndrInfo.fdType = 'thng') and (cpb.ioFlFndrInfo.fdCreator = ICcreator);
  86.                     end; (* if *)
  87.                     ndx := ndx + 1;
  88.                 until found or (err <> noErr);
  89.                 if not found then begin
  90.                     where.name := GetAString(128, 12);
  91.                     err := fnfErr;
  92.                 end; (* if *)
  93.             end; (* if *)
  94.         end; (* if *)
  95.         IsInstalled := (err = noErr);
  96.     end; (* IsInstalled *)
  97.  
  98.     procedure UpdateInstalledVersion (var fss: FSSpec);
  99.         var
  100.             ref: integer;
  101.             err: OSErr;
  102.     begin
  103.         installed_version := 0;
  104.         if IsInstalled(fss) then begin
  105.             ref := HOpenResFile(fss.vRefNum, fss.parID, fss.name, fsRdPerm);
  106.             err := ResError;
  107.             if err = noErr then begin
  108.                 installed_version := GetVersionFromResFile;
  109.                 CloseResFile(ref);
  110.             end; (* if *)
  111.         end;
  112.     end;
  113.  
  114.     function SaveComponentToFile (fss: FSSpec): OSErr;
  115.         var
  116.             err: OSErr;
  117.             thng: Handle;
  118.             rref: integer;
  119.             junk: OSErr;
  120.     begin
  121.         err := noErr;
  122.         thng := GetResource('ThNg', 128);
  123.         if thng = nil then begin
  124.             err := resNotFound;
  125.         end; (* if *)
  126.         if err = noErr then begin
  127.             HNoPurge(thng);
  128.             junk := HCreate(fss.vRefNum, fss.parID, fss.name, ICcreator, 'thng');
  129.             err := HOpenRF(fss.vRefNum, fss.parID, fss.name, fsRdWrPerm, rref);
  130.             if err = noErr then begin
  131.                 err := SetEOF(rref, GetHandleSize(thng));
  132.                 if err = noErr then begin
  133.                     err := FSWriteQ(rref, GetHandleSize(thng), thng^);
  134.                 end; (* if *)
  135.                 junk := FSClose(rref);
  136.             end; (* if *)
  137.             HPurge(thng);
  138.         end; (* if *)
  139.         UpdateInstalledVersion(fss); { in case we are installing or saving to the init }
  140.         SaveComponentToFile := err;
  141.     end; (* SaveComponentToFile *)
  142.  
  143.     function RegisterFile (fss: FSSpec): OSErr;
  144.         var
  145.             ref: integer;
  146.             err, err2: OSErr;
  147.             result: longint;
  148.     begin
  149.         ref := HOpenResFile(fss.vRefNum, fss.parID, fss.name, fsRdPerm);
  150.         err := ResError;
  151.         if err = noErr then begin
  152.             result := RegisterComponentResourceFile(ref, registerCmpGlobal);
  153.             if result > 0 then begin
  154.                 err := noErr;
  155.             end else begin
  156.                 err := result;
  157.             end; (* if *)
  158.             CloseResFile(ref);
  159.             err2 := ResError;
  160.             if err = noErr then begin
  161.                 err := err2;
  162.             end; (* if *)
  163.         end; (* if *)
  164.         RegisterFile := err;
  165.     end; (* RegisterFile *)
  166.  
  167.     function SaveICComponent: OSErr;
  168.         var
  169.             err: OSErr;
  170.             fss: FSSpec;
  171.     begin
  172.         err := ICStandardPutFile(GetAString(128, 13), GetAString(128, 12), fss);
  173.         if err = noErr then begin
  174.             err := SaveComponentToFile(fss);
  175.         end;
  176.         SaveICComponent := err;
  177.     end; (* SaveICComponent *)
  178.  
  179.     function JustInstallICComponent: OSErr;
  180.         var
  181.             err: OSErr;
  182.             where: FSSpec;
  183.     begin
  184.         UpdateInstalledVersion(where);
  185.         err := SaveComponentToFile(where);
  186.         if err = noErr then begin
  187.             if has_components then begin
  188.                 err := RegisterFile(where);
  189.             end;
  190.         end; (* if *)
  191.         JustInstallICComponent := err;
  192.     end;
  193.  
  194.     function InstallICComponent: OSErr;
  195.         var
  196.             err: OSErr;
  197.             where: FSSpec;
  198.             prompt: Str255;
  199.             junk: integer;
  200.             registered_version: longInt;
  201.     begin
  202.         err := noErr;
  203.         registered_version := 0;
  204.         UpdateInstalledVersion(where);
  205.         if (installed_version > 0) then begin
  206.             if installed_version < application_version then begin
  207.                 prompt := GetAString(128, 17);
  208.             end else if installed_version < application_version then begin
  209.                 prompt := GetAString(128, 18);
  210.             end else if installed_version = application_version then begin
  211.                 prompt := GetAString(128, 19);
  212.             end; (* if *)
  213.             ParamText(prompt, '', '', '');
  214.             InitCursor;
  215.             if CautionAlert(145, @CancelModalFilter) <> ok then begin
  216.                 err := userCanceledErr;
  217.             end; (* if *)
  218.         end; (* if *)
  219.         if err = noErr then begin
  220.             err := JustInstallICComponent;
  221.         end; (* if *)
  222.         if err = noErr then begin
  223.             InitCursor;
  224.             ParamText(GetAString(128, 20), '', '', '');
  225.             junk := NoteAlert(142, nil);
  226.         end; (* if *)
  227.         InstallICComponent := err;
  228.     end; (* InstallICComponent *)
  229.  
  230.     function RemoveICComponent: OSErr;
  231.         var
  232.             err: OSErr;
  233.             fss: FSSpec;
  234.             junk: integer;
  235.     begin
  236.         err := noErr;
  237.         UpdateInstalledVersion(fss);
  238.         if installed_version > 0 then begin
  239.             err := HDelete(fss.vRefNum, fss.parID, fss.name);
  240.         end;
  241.         if err = noErr then begin
  242.             if GetRegisteredVersion > 0 then begin
  243.                 junk := NoteAlert(144, nil);
  244.             end;
  245.         end;
  246.         UpdateInstalledVersion(fss);
  247.         RemoveICComponent := err;
  248.     end;
  249.  
  250.     procedure AdjustInstalMenu (menu: integer);
  251.     begin
  252.         if has_components then begin
  253.             SetItemEnable(GetMenuHandle(menu), IM_Install, installed_version <> application_version);
  254.         end else begin
  255.             SetItemEnable(GetMenuHandle(menu), IM_Install, false);
  256.         end;
  257.         SetItemEnable(GetMenuHandle(menu), IM_Remove, installed_version > 0);
  258.     end;
  259.  
  260.     procedure DoInstallMenu (menu, item: integer);
  261.     begin
  262.         menu := menu; { Unused }
  263.         case item of
  264.             IM_Install: 
  265.                 DisplayError(acInstallComponent, InstallICComponent);
  266.             IM_Save: 
  267.                 DisplayError(acInstallComponent, SaveICComponent);
  268.             IM_Remove: 
  269.                 DisplayError(acRemoveComponent, RemoveICComponent);
  270.             otherwise
  271.                 ;
  272.         end; (* case *)
  273.     end;
  274.  
  275.     function CheckICUsageVersion: OSErr;
  276.         var
  277.             err, err2: OSErr;
  278.             component_instance: ComponentInstance;
  279.             inst: ICInstance;
  280.     begin
  281.         err := ICMapErr(ICStart(inst, ICcreator));
  282.         if err = noErr then begin
  283.             err := ICMapErr(ICGetComponentInstance(inst, component_instance));
  284.             if err = noErr then begin
  285.                 if BAND(GetComponentVersion(component_instance), $FFFF0000) < BAND(internetConfigurationComponentInterfaceVersion, $FFFF0000) then begin
  286.                     err := unimpErr;
  287.                 end;
  288.             end else begin
  289.                 err := noErr; { we work fine without a component, we just can't deal with an old component }
  290.             end;
  291.             err2 := ICMapErr(ICStop(inst));
  292.             if err = noErr then begin
  293.                 err := err2;
  294.             end;
  295.         end;
  296.         CheckICUsageVersion := err;
  297.     end;
  298.  
  299.     function InitializeComponentInstallation: OSErr;
  300.         var
  301.             fss: FSSpec;
  302.             a: integer;
  303.             err: OSErr;
  304.     begin
  305.         err := noErr;
  306.         application_version := longInt(app_version.numericVersion);
  307.         UpdateInstalledVersion(fss);
  308.         if has_components then begin
  309.             if (installed_version < application_version) then begin
  310.                 InitCursor;
  311.                 if installed_version > 0 then begin
  312.                     a := NoteAlert(146, @CancelModalFilter);
  313.                     if a <> ok then begin
  314.                         err := userCanceledErr;
  315.                     end;
  316.                 end else begin
  317.                     ParamText(GetAString(128, 8), '', '', '');
  318.                     a := NoteAlert(141, @CancelModalFilter);
  319.                 end;
  320.                 if a = ok then begin
  321.                     err := JustInstallICComponent;
  322.                     DisplayError(acInstallComponent, err);
  323.                     if err = noErr then begin
  324.                         err := CheckICUsageVersion;
  325.                         if err = noErr then begin
  326.                             InitCursor;
  327.                             ParamText(GetAString(128, 20), '', '', '');
  328.                             a := NoteAlert(142, nil);
  329.                         end else begin
  330.                             InitCursor;
  331.                             ParamText(GetAString(128, 26), '', '', '');
  332.                             a := NoteAlert(142, nil);
  333.                             err := userCanceledErr;
  334.                         end;
  335.                     end;
  336.                 end;
  337.             end;
  338.         end;
  339. { Ensure invariant that we are using the glue, or we are using the current version of the component }
  340.         if err = noErr then begin
  341.             err := CheckICUsageVersion;
  342.         end;
  343.         InitializeComponentInstallation := err;
  344.     end;
  345.  
  346. end. (* ICInstall *)
  347. temp_instance: ComponentInstance;
  348. temp_instance := OpenDefaultComponent(internetConfigurationComponentType, internetConfigurationComponentSubType);
  349. if temp_instance <> nil then begin
  350.     junk := CloseComponent(temp_instance);
  351. end;